{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Numpy "
   ]
  },
  {
   "source": [
    "Numpy provides a high-performance multidimensional array and basic tools to compute with and manipulate these arrays."
   ],
   "cell_type": "markdown",
   "metadata": {}
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Basics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[1 2 3]\n"
    }
   ],
   "source": [
    "a = np.array([1,2,3], dtype='int32')\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[9. 8. 7.]\n [6. 5. 4.]]\n"
    }
   ],
   "source": [
    "b = np.array([[9.0,8.0,7.0],[6.0,5.0,4.0]])\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "1"
     },
     "metadata": {},
     "execution_count": 7
    }
   ],
   "source": [
    "# Get Dimension\n",
    "a.ndim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "(2, 3)"
     },
     "metadata": {},
     "execution_count": 8
    }
   ],
   "source": [
    "# Get Shape\n",
    "b.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "dtype(&#39;int32&#39;)"
     },
     "metadata": {},
     "execution_count": 9
    }
   ],
   "source": [
    "# Get Type\n",
    "a.dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "4"
     },
     "metadata": {},
     "execution_count": 10
    }
   ],
   "source": [
    "# Get Size\n",
    "a.itemsize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "12"
     },
     "metadata": {},
     "execution_count": 11
    }
   ],
   "source": [
    "# Get total size\n",
    "a.nbytes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "3"
     },
     "metadata": {},
     "execution_count": 12
    }
   ],
   "source": [
    "# Get number of elements\n",
    "a.size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Accessing/Changing specific elements, rows, columns, etc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[ 1  2  3  4  5  6  7]\n [ 8  9 10 11 12 13 14]]\n"
    }
   ],
   "source": [
    "a = np.array([[1,2,3,4,5,6,7],[8,9,10,11,12,13,14]])\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "13"
     },
     "metadata": {},
     "execution_count": 14
    }
   ],
   "source": [
    "# Get a specific element [r, c]\n",
    "a[1, 5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([1, 2, 3, 4, 5, 6, 7])"
     },
     "metadata": {},
     "execution_count": 15
    }
   ],
   "source": [
    "# Get a specific row \n",
    "a[0, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([ 3, 10])"
     },
     "metadata": {},
     "execution_count": 16
    }
   ],
   "source": [
    "# Get a specific column\n",
    "a[:, 2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([2, 4, 6])"
     },
     "metadata": {},
     "execution_count": 17
    }
   ],
   "source": [
    "# Getting a little more fancy [startindex:endindex:stepsize]\n",
    "a[0, 1:-1:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[ 1  2  1  4  5  6  7]\n [ 8  9  2 11 12 20 14]]\n"
    }
   ],
   "source": [
    "a[1,5] = 20\n",
    "\n",
    "a[:,2] = [1,2]\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*3-d example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[[1 2]\n  [3 4]]\n\n [[5 6]\n  [7 8]]]\n"
    }
   ],
   "source": [
    "b = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])\n",
    "print(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "4"
     },
     "metadata": {},
     "execution_count": 20
    }
   ],
   "source": [
    "# Get specific element (work outside in)\n",
    "b[0,1,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# replace \n",
    "b[:,1,:] = [[9,9],[8,8]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[[1, 2],\n        [9, 9]],\n\n       [[5, 6],\n        [8, 8]]])"
     },
     "metadata": {},
     "execution_count": 22
    }
   ],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### For a lot more, visit (https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Initializing Different Types of Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[0., 0., 0.],\n       [0., 0., 0.]])"
     },
     "metadata": {},
     "execution_count": 23
    }
   ],
   "source": [
    "# All 0s matrix\n",
    "np.zeros((2,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[[1, 1],\n        [1, 1]],\n\n       [[1, 1],\n        [1, 1]],\n\n       [[1, 1],\n        [1, 1]],\n\n       [[1, 1],\n        [1, 1]]], dtype=int32)"
     },
     "metadata": {},
     "execution_count": 24
    }
   ],
   "source": [
    "# All 1s matrix\n",
    "np.ones((4,2,2), dtype='int32')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[99, 99],\n       [99, 99]])"
     },
     "metadata": {},
     "execution_count": 25
    }
   ],
   "source": [
    "# Any other number\n",
    "np.full((2,2), 99)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[4, 4, 4, 4, 4, 4, 4],\n       [4, 4, 4, 4, 4, 4, 4]])"
     },
     "metadata": {},
     "execution_count": 26
    }
   ],
   "source": [
    "# Any other number (full_like)\n",
    "np.full_like(a, 4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[0.48889763, 0.38845436],\n       [0.79434606, 0.91713503],\n       [0.80277928, 0.03482337],\n       [0.03027321, 0.11453361]])"
     },
     "metadata": {},
     "execution_count": 27
    }
   ],
   "source": [
    "# Random decimal numbers\n",
    "np.random.rand(4,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[ 4, -4,  1],\n       [ 4,  0, -1],\n       [ 1,  6, -3]])"
     },
     "metadata": {},
     "execution_count": 28
    }
   ],
   "source": [
    "# Random Integer values\n",
    "np.random.randint(-4,8, size=(3,3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[1., 0., 0., 0., 0.],\n       [0., 1., 0., 0., 0.],\n       [0., 0., 1., 0., 0.],\n       [0., 0., 0., 1., 0.],\n       [0., 0., 0., 0., 1.]])"
     },
     "metadata": {},
     "execution_count": 29
    }
   ],
   "source": [
    "# The identity matrix\n",
    "np.identity(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[1 2 3]\n [1 2 3]\n [1 2 3]]\n"
    }
   ],
   "source": [
    "# Repeat an array\n",
    "arr = np.array([[1,2,3]])\n",
    "r1 = np.repeat(arr,3, axis=0)\n",
    "print(r1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[1. 1. 1. 1. 1.]\n [1. 1. 1. 1. 1.]\n [1. 1. 1. 1. 1.]\n [1. 1. 1. 1. 1.]\n [1. 1. 1. 1. 1.]]\n[[0. 0. 0.]\n [0. 9. 0.]\n [0. 0. 0.]]\n[[1. 1. 1. 1. 1.]\n [1. 0. 0. 0. 1.]\n [1. 0. 9. 0. 1.]\n [1. 0. 0. 0. 1.]\n [1. 1. 1. 1. 1.]]\n"
    }
   ],
   "source": [
    "output = np.ones((5,5))\n",
    "print(output)\n",
    "\n",
    "z = np.zeros((3,3))\n",
    "z[1,1] = 9\n",
    "print(z)\n",
    "\n",
    "output[1:-1,1:-1] = z\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Be careful when copying arrays!!!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[1 2 3]\n"
    }
   ],
   "source": [
    "a = np.array([1,2,3])\n",
    "b = a.copy()\n",
    "b[0] = 100\n",
    "\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### For lots more, visit (https://numpy.org/doc/stable/reference/routines.array-creation.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mathematics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Part 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[1 2 3 4]\n"
    }
   ],
   "source": [
    "a = np.array([1,2,3,4])\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([3, 4, 5, 6])"
     },
     "metadata": {},
     "execution_count": 34
    }
   ],
   "source": [
    "a + 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([-1,  0,  1,  2])"
     },
     "metadata": {},
     "execution_count": 35
    }
   ],
   "source": [
    "a - 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([2, 4, 6, 8])"
     },
     "metadata": {},
     "execution_count": 36
    }
   ],
   "source": [
    "a * 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([0.5, 1. , 1.5, 2. ])"
     },
     "metadata": {},
     "execution_count": 37
    }
   ],
   "source": [
    "a / 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([2, 2, 4, 4])"
     },
     "metadata": {},
     "execution_count": 38
    }
   ],
   "source": [
    "b = np.array([1,0,1,0])\n",
    "a + b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([ 1,  4,  9, 16])"
     },
     "metadata": {},
     "execution_count": 39
    }
   ],
   "source": [
    "a ** 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362])"
     },
     "metadata": {},
     "execution_count": 40
    }
   ],
   "source": [
    "np.cos(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([ 0.84147098,  0.90929743,  0.14112001, -0.7568025 ])"
     },
     "metadata": {},
     "execution_count": 41
    }
   ],
   "source": [
    "np.sin(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([0.        , 0.5       , 0.70710678, 0.8660254 , 1.        ])"
     },
     "metadata": {},
     "execution_count": 42
    }
   ],
   "source": [
    "np.sin(np.array((0 , 30, 45, 60, 90 )) * np.pi / 180)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Part 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.array([[1,2],[3,4]])\n",
    "y = np.array([[6,7],[8,9]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[ 7  9]\n [11 13]]\n[[ 7  9]\n [11 13]]\n"
    }
   ],
   "source": [
    "print(x+y)\n",
    "print(np.add(x,y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[5 5]\n [5 5]]\n[[5 5]\n [5 5]]\n"
    }
   ],
   "source": [
    "print(y-x)\n",
    "print(np.subtract(y,x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[ 6 14]\n [24 36]]\n[[ 6 14]\n [24 36]]\n"
    }
   ],
   "source": [
    "print(x*y)\n",
    "print(np.multiply(x,y))  #This is element-wise multiplication not matrix multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[0.16666667 0.28571429]\n [0.375      0.44444444]]\n[[0.16666667 0.28571429]\n [0.375      0.44444444]]\n"
    }
   ],
   "source": [
    "print(x/y)\n",
    "print(np.divide(x,y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[22 25]\n [50 57]]\n[[22 25]\n [50 57]]\n"
    }
   ],
   "source": [
    "print(x.dot(y))\n",
    "print(np.dot(x,y)) #This is matrix multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[1 2]\n [3 4]] \nTranspose of matrix x: \n [[1 3]\n [2 4]]\n"
    }
   ],
   "source": [
    "print(x,\"\\nTranspose of matrix x: \\n\",x.T) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Conditional access of arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[False, False],\n       [ True,  True],\n       [ True,  True]])"
     },
     "metadata": {},
     "execution_count": 50
    }
   ],
   "source": [
    "a = np.array([[1,2],[3,4],[5,6]])\n",
    "c = a>2\n",
    "c\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[3 4 5 6] [3 4 5 6]\n"
    }
   ],
   "source": [
    "print(a[c],a[a>2]) #any of them can be used"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([1, 2, 3, 4, 5, 6])"
     },
     "metadata": {},
     "execution_count": 52
    }
   ],
   "source": [
    "a[(a>2) | (a<5)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([3, 4])"
     },
     "metadata": {},
     "execution_count": 53
    }
   ],
   "source": [
    "a[(a>2) & (a<5)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### For a lot more (https://docs.scipy.org/doc/numpy/reference/routines.math.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear Algebra"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[1. 1. 1.]\n [1. 1. 1.]]\n[[2 2]\n [2 2]\n [2 2]]\n"
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[6., 6.],\n       [6., 6.]])"
     },
     "metadata": {},
     "execution_count": 54
    }
   ],
   "source": [
    "a = np.ones((2,3))\n",
    "print(a)\n",
    "\n",
    "b = np.full((3,2), 2)\n",
    "print(b)\n",
    "\n",
    "np.matmul(a,b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "1.0"
     },
     "metadata": {},
     "execution_count": 55
    }
   ],
   "source": [
    "# Find the determinant\n",
    "c = np.identity(3)\n",
    "np.linalg.det(c)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Reference docs (https://docs.scipy.org/doc/numpy/reference/routines.linalg.html)\n",
    "\n",
    "###### Determinant, Trace, Singular Vector Decomposition, Eigenvalues, Matrix Norm, Inverse, Etc..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Statistics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[1, 2, 3],\n       [4, 5, 6]])"
     },
     "metadata": {},
     "execution_count": 56
    }
   ],
   "source": [
    "stats = np.array([[1,2,3],[4,5,6]])\n",
    "stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "1"
     },
     "metadata": {},
     "execution_count": 57
    }
   ],
   "source": [
    "np.min(stats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([3, 6])"
     },
     "metadata": {},
     "execution_count": 58
    }
   ],
   "source": [
    "np.max(stats, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([5, 7, 9])"
     },
     "metadata": {},
     "execution_count": 59
    }
   ],
   "source": [
    "np.sum(stats, axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Min, Max, Mean, Sum, Square root & Standard deviation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "12\n99\n400\n57.142857142857146\n[7.48331477 5.83095189 9.32737905 3.46410162 6.70820393 8.18535277\n 9.94987437]\n27.935786426469296\n\n\n12\n400\n"
    }
   ],
   "source": [
    "a = np.array([56,34,87,12,45,67,99])\n",
    "\n",
    "print(a.min()) #We can write it either way\n",
    "print(a.max())\n",
    "print(a.sum())\n",
    "print(a.mean())\n",
    "print(np.sqrt(a))\n",
    "print(np.std(a))\n",
    "\n",
    "print('\\n')\n",
    "\n",
    "print(np.min(a)) #We can write it either way\n",
    "print(np.sum(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Calculating mean,median with python in-built functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[20, 2, 7, 8, 45]\n8.0\n16.4\n"
    }
   ],
   "source": [
    "#1D Array\n",
    "arr = [20,2,7,8,45]\n",
    "print(arr)\n",
    "print(np.median(arr))\n",
    "print(np.mean(arr))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "\nMedian of array with none defined axis:  5.0\nMean of array with none defined axis:  5.333333333333333\n\nMedian of array with axis defined at 0:  [8. 5. 5. 6.]\nMean of array with axis defined at 0:  [6.33333333 4.66666667 5.         5.33333333]\n\nMedian of array with axis defined at 1:  [6.  5.5 4.5]\nMean of array with axis defined at 1:  [5.25 5.75 5.  ]\n"
    }
   ],
   "source": [
    "#2D Array\n",
    "arr = [[2,5,7,7],\n",
    "       [9,5,3,6],\n",
    "       [8,4,5,3]]\n",
    "\n",
    "# Mean, Median of array\n",
    "print(\"\\nMedian of array with none defined axis: \",np.median(arr))\n",
    "print(\"Mean of array with none defined axis: \",np.mean(arr))\n",
    "\n",
    "# Mean, Median of array along the axis = 0 ie., the values will be taken across Columns\n",
    "print(\"\\nMedian of array with axis defined at 0: \",np.median(arr, axis = 0))\n",
    "print(\"Mean of array with axis defined at 0: \",np.mean(arr, axis = 0))\n",
    "\n",
    "# Mean, Median of array along the axis = 1 ie., the values will be taken across Rows\n",
    "print(\"\\nMedian of array with axis defined at 1: \",np.median(arr, axis = 1))\n",
    "print(\"Mean of array with axis defined at 1: \",np.mean(arr, axis = 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Reorganizing Arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": "[[1 2 3 4]\n [5 6 7 8]]\n[[1 2]\n [3 4]\n [5 6]\n [7 8]]\n"
    }
   ],
   "source": [
    "before = np.array([[1,2,3,4],[5,6,7,8]])\n",
    "print(before)\n",
    "\n",
    "after = before.reshape((4,2))\n",
    "print(after)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[1, 2, 3, 4],\n       [5, 6, 7, 8],\n       [1, 2, 3, 4],\n       [5, 6, 7, 8]])"
     },
     "metadata": {},
     "execution_count": 64
    }
   ],
   "source": [
    "# Vertically stacking vectors\n",
    "v1 = np.array([1,2,3,4])\n",
    "v2 = np.array([5,6,7,8])\n",
    "\n",
    "np.vstack([v1,v2,v1,v2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[1., 1., 1., 1., 0., 0.],\n       [1., 1., 1., 1., 0., 0.]])"
     },
     "metadata": {},
     "execution_count": 65
    }
   ],
   "source": [
    "# Horizontal  stack\n",
    "h1 = np.ones((2,4))\n",
    "h2 = np.zeros((2,2))\n",
    "\n",
    "np.hstack((h1,h2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": "array([[1, 2, 3, 4],\n       [1, 2, 3, 4],\n       [1, 2, 3, 4],\n       [1, 2, 3, 4]])"
     },
     "metadata": {},
     "execution_count": 66
    }
   ],
   "source": [
    "np.tile(v1,(4,1)) # Stack 4 copies of v1 on top of each other"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Special Numpy functions\n",
    "##### Load Data from File"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "output_type": "error",
     "ename": "OSError",
     "evalue": "data.txt not found.",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mOSError\u001b[0m                                   Traceback (most recent call last)",
      "\u001b[0;32m&lt;ipython-input-67-7084bddee6ac&gt;\u001b[0m in \u001b[0;36m&lt;module&gt;\u001b[0;34m\u001b[0m\n\u001b[0;32m----&gt; 1\u001b[0;31m \u001b[0mfiledata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenfromtxt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m&#39;data.txt&#39;\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m&#39;,&#39;\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mfiledata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfiledata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m&#39;int32&#39;\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfiledata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/lib/npyio.py\u001b[0m in \u001b[0;36mgenfromtxt\u001b[0;34m(fname, dtype, comments, delimiter, skip_header, skip_footer, converters, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise, max_rows, encoding)\u001b[0m\n\u001b[1;32m   1770\u001b[0m             \u001b[0mfname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos_fspath\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1771\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbasestring\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-&gt; 1772\u001b[0;31m             \u001b[0mfid\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_datasource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m&#39;rt&#39;\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1773\u001b[0m             \u001b[0mfid_ctx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcontextlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclosing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1774\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(path, mode, destpath, encoding, newline)\u001b[0m\n\u001b[1;32m    267\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    268\u001b[0m     \u001b[0mds\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataSource\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdestpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--&gt; 269\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencoding\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencoding\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnewline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    270\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    271\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/numpy/lib/_datasource.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, path, mode, encoding, newline)\u001b[0m\n\u001b[1;32m    621\u001b[0m                                       encoding=encoding, newline=newline)\n\u001b[1;32m    622\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--&gt; 623\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mIOError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m&quot;%s not found.&quot;\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    624\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    625\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mOSError\u001b[0m: data.txt not found."
     ]
    }
   ],
   "source": [
    "filedata = np.genfromtxt('data.txt', delimiter=',')\n",
    "filedata = filedata.astype('int32')\n",
    "print(filedata)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Boolean Masking and Advanced Indexing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True,  True,  True,  True,  True, False,  True,  True,  True,\n",
       "         True,  True,  True,  True,  True,  True,  True,  True,  True],\n",
       "       [ True,  True,  True,  True,  True, False,  True, False,  True,\n",
       "         True,  True,  True,  True,  True,  True,  True,  True,  True],\n",
       "       [ True,  True,  True,  True,  True,  True,  True,  True, False,\n",
       "         True,  True,  True,  True,  True,  True,  True, False, False]])"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(~((filedata > 50) & (filedata < 100)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Ravel & Flatten"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2 3]\n",
      " [4 5 6]]\n",
      "[1 2 3 4 5 6]\n",
      "[1 2 3 4 5 6]\n"
     ]
    }
   ],
   "source": [
    "x = np.array([(1,2,3),(4,5,6)])\n",
    "\n",
    "print(x) #Master\n",
    "print(x.ravel())\n",
    "print(x.flatten()) #The function of both commands is same ie., to convert a matrix in a single line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[11  2  3  4  5  6]\n",
      "[22  2  3  4  5  6]\n"
     ]
    }
   ],
   "source": [
    "y = x.ravel()\n",
    "y[0]=11 #Master replacement is supported\n",
    "print(y)\n",
    "\n",
    "z = x.flatten()#Master replacement is not supported\n",
    "z[0]=22\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[11  2  3]\n",
      " [ 4  5  6]]\n"
     ]
    }
   ],
   "source": [
    "print(x) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7\n",
      " 1.8 1.9 2.  2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.  3.1 3.2 3.3 3.4 3.5\n",
      " 3.6 3.7 3.8 3.9 4.  4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.  5.1 5.2 5.3\n",
      " 5.4 5.5 5.6 5.7 5.8 5.9 6.  6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.  7.1\n",
      " 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.  8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9\n",
      " 9.  9.1 9.2 9.3 9.4]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline               \n",
    "#To print the graph in line of the components of cell\n",
    "x = np.arange(0, 3*np.pi, 0.1)   #(start, end, step index)\n",
    "y = np.sin(x)\n",
    "print(x)\n",
    "plt.plot(x,y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7\n",
      " 1.8 1.9 2.  2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.  3.1 3.2 3.3 3.4 3.5\n",
      " 3.6 3.7 3.8 3.9 4.  4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.  5.1 5.2 5.3\n",
      " 5.4 5.5 5.6 5.7 5.8 5.9 6.  6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.  7.1\n",
      " 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8.  8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9\n",
      " 9.  9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline               \n",
    "x = np.arange(0, 10, 0.1)   \n",
    "y = np.cos(x)\n",
    "print(x)\n",
    "plt.plot(x,y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2-final"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}